#ifndef ZZH_HEADER_H
#define ZZH_HEADER_H

#define MAX_SIZE 1024
#define LOG_ERR -1
#define LOG_INFO 0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include <stdbool.h>

// 文件流
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
// 目录流
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
// 文件流
#include <fcntl.h>
#include <sys/mman.h>

#include <sys/select.h>
#include <sys/time.h>
#include <sys/wait.h>

#include <syslog.h>
#include <sys/ipc.h>
#include <sys/shm.h>

//线程
#include <pthread.h>

//网络编程
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <sys/sendfile.h>

/* #define st_mtime st_mtim.tv_sec */

// 检查命令行参数数量是否符合预期
#define ARGS_CHECK(argc, expected) \
    do { \
        if ((argc) != (expected)) { \
            fprintf(stderr, "args num error!\n");\ 
            exit(1); \       
        } \                          
    } while (0)                      

// 检查返回值是否是错误标记,若是则打印msg和错误信息
#define ERROR_CHECK(ret, error_flag, msg) \
    do { \
        if ((ret) == (error_flag)) { \
            perror(msg); \
            exit(1); \
        } \
    } while (0)
// 将pthread库函数检查报错的流程封装成类似于ERROR_CHECK的带参数宏定义。
#define THREAD_ERROR_CHECK(ret,msg) \
    do { \
        if (ret != 0) { \
            fprintf(stderr,"%s:%s\n",msg, strerror(ret)); \
            exit(-1); \
        } \
    } while (0)
#define LOG_CHECK(ret,msg)\
    do { \
        if ((ret) == -1) { \
            syslog(LOG_ERR, "[ERROR] %s: %s", msg, strerror(ret)); \
        } else if ((ret) == 0) { \
            syslog(LOG_INFO, "[INFO] " msg); \
        } else { \
            syslog(LOG_WARNING, "[WARNING] " msg); \
        } \
    } while (0)
#endif
